// 导入数据库操作模块
const db = require('../db/index')
// 导入bcryptjs插件 对用户密码进行加密 
const bcerptjs = require('bcryptjs')
// 导入Token包
const jwt = require('jsonwebtoken')
const config = require('../config')

// 注册的处理函数
exports.reguser = (req, res) => {
    // 获取客户端提交的数据
    const userInfo = req.body
    // 对数据为空进行校验
    if(!userInfo.username || !userInfo.password){
        return res.cc('用户名或密码为空')
    }
    // 对用户名是否唯一进行校验
    const selectUsername = 'select * from ev_USERS where username=?'
    db.query(selectUsername,userInfo.username,(err,results)=>{
        // results 结果为数组类型
        if(err){
            return res.cc(err.message)
        }
        // 判断用户名是否占用
        if(results.length>0){
            return  res.cc('用户名已经被占用')
        }
        // 用户名可用 对密码进行加密存储
        userInfo.password = bcerptjs.hashSync(userInfo.password,10)
        // 向数据库插入用户数据
        const insterUser = 'insert into ev_users set ?'
        // 没有简写成userInfo 是因为客服端有时提交的数据不止用户名与密码
        // 所以再定义自己需要插入的数据
        db.query(insterUser,{username:userInfo.username,password:userInfo.password},(err,results)=>{
            if(err){
                return res.cc(err.message)
            }
            // 判断影响函数是否为1 不为1执行依旧失败
            if(results.affectedRows !== 1){
                return res.cc('请稍后再试')
            }
            // 注册成功
            res.cc('注册成功',0)
        }) 
    })
}
// 登录的处理函数
exports.login = (req, res) => {
    const userInfo = req.body
    const selectUser = 'select * from ev_users where username =?'
    // 从数据库中查询传递过来的用户信息
    db.query(selectUser,userInfo.username,(err,results)=>{
        if(err) return res.cc(err)
        // 执行sql语句成功 但数据条数为零
        if(results.length !== 1){
            return res.cc('登录失败')
        }
        //校验密码 拿着客服端传递过来的密码，和数据库中加密的密文进行对比，看还原之后能否一样
        const compareResult = bcerptjs.compareSync(userInfo.password,results[0].password)
        if(!compareResult){
            return res.cc('登录失败！')
        }
        // 校验成功 生成token字符串，传递给客服端
        // 生成token前 通过 ES6 的语法 快速剔除密码和头像的值
        const user = {...results[0],password:'',user_pic:''}
        // 对用户信息进行加密 生成token
        const tokenStr = jwt.sign(user,config.jwtSecretKey,{expiresIn:'10h'})
        // 将token相应给客户端
        res.send({
            status:0,
            message:'登录成功',
            token:'Bearer '+tokenStr
        })
    })
} 